package editorsvg.propiedades.tabla;

import editorsvg.propiedades.GrupoPropiedades;
import editorsvg.propiedades.Propiedad;
import javax.swing.table.AbstractTableModel;

/**
 * Modelo de datos para la tabla de propiedades.
 *
 * @author Jorge Berjano
 */
public class ModeloTablaPropiedades extends AbstractTableModel {
    
    private GrupoPropiedades grupoPropiedades;
   
    /** 
     * Constructor.
     * @param grupoPropiedades Propiedades que representan el modelo
     */
    public ModeloTablaPropiedades(GrupoPropiedades grupoPropiedades) {
        this.grupoPropiedades = grupoPropiedades;
    }

    public int getRowCount() {
        // Tantas filas como numero de propiedades haya.
        if (grupoPropiedades == null)
            return 0;
        else
            return grupoPropiedades.getNumeroPropiedades();
    }

    public int getColumnCount() {
        // Tres columnas: nombre, valor y boton de edición.
        return 3;
    }

    public String getColumnName(int columna) {
        if (columna == 0)
            return "Propiedad";
        else if (columna == 1)
            return "Valor";
        else
            return "";
    }
    
    /**
     * Cambia el valor que contiene una determinada casilla de la tabla
     */
    public void setValueAt(Object valor, int fila, int columna) {
        if (columna == 1 && grupoPropiedades != null)
            grupoPropiedades.parsearPropiedad(fila, valor.toString());
    }

    /**
     * Obtiene el valor de una celda
     */
    public Object getValueAt(int fila, int columna) {
        if (grupoPropiedades == null)
            return null;
        
        if (columna == 0)
            // Nombre del parámetro
            return grupoPropiedades.obtenerPropiedad(fila).getNombre();
        else if (columna == 1) {
            // Valor del parámetro en forma de texto
            return grupoPropiedades.obtenerPropiedad(fila);
        }
        else {
            // el valor de la última columna es el componente para editar
            // el parámetro (normalmente un botón)
            Propiedad propiedad = grupoPropiedades.obtenerPropiedad(fila);
            return propiedad.obtenerComponenteModificacion();
        }
    }
    
    /**
     * Indica si una celda es editable
     */
    public boolean isCellEditable(int fila, int columna) {
        boolean editable = false;
        
        if (grupoPropiedades != null) {
            if (columna == 1)
                editable = grupoPropiedades.obtenerPropiedad(fila).permitirEditarTexto();
            else if (columna == 2)
                editable = grupoPropiedades.obtenerPropiedad(fila).permitirPulsarBoton();
        }
            
        return editable;
    } 

    /**
     * Actualiza la tabla a la que pertenece el modelo notificandole que los datos han cambiado.
     */
    public void actualizar() {       
        fireTableDataChanged();
    }
}
